{"componentChunkName":"component---src-templates-blog-page-index-tsx","path":"/produto-constante-amm/","result":{"data":{"mdx":{"body":"var _excluded = [\"components\"];\n\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"layout\": \"BlogPage\",\n  \"title\": \"Como criar um produto constante AMM\",\n  \"description\": \"Nesse artigo iremos aprender a como criar um produto constante AMM através de contrato inteligente.\",\n  \"image\": \"capa.jpg\",\n  \"tags\": [\"Intermediário\", \"DeFi\"],\n  \"author\": [\"Matheus\"],\n  \"publishedAt\": \"21/07/2022\",\n  \"modifiedAt\": \"20220721\",\n  \"suburl\": \"produto-constante-amm/\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, _excluded);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"Nesse artigo iremos aprender a como criar um produto constante AMM atrav\\xE9s de contrato inteligente.\"), mdx(\"h2\", {\n    \"id\": \"produto-constante-amm\"\n  }, \"Produto Constante AMM\"), mdx(\"p\", null, \"Produto constante AMM \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"XY = K\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\ncontract CPAMM {\\n    IERC20 public immutable token0;\\n    IERC20 public immutable token1;\\n\\n    uint public reserve0;\\n    uint public reserve1;\\n\\n    uint public totalSupply;\\n    mapping(address => uint) public balanceOf;\\n\\n    constructor(address _token0, address _token1) {\\n        token0 = IERC20(_token0);\\n        token1 = IERC20(_token1);\\n    }\\n\\n    function _mint(address _to, uint _amount) private {\\n        balanceOf[_to] += _amount;\\n        totalSupply += _amount;\\n    }\\n\\n    function _burn(address _from, uint _amount) private {\\n        balanceOf[_from] -= _amount;\\n        totalSupply -= _amount;\\n    }\\n\\n    function _update(uint _reserve0, uint _reserve1) private {\\n        reserve0 = _reserve0;\\n        reserve1 = _reserve1;\\n    }\\n\\n    function swap(address _tokenIn, uint _amountIn) external returns (uint amountOut) {\\n        require(\\n            _tokenIn == address(token0) || _tokenIn == address(token1),\\n            \\\"token inv\\xE1lido\\\"\\n        );\\n        require(_amountIn > 0, \\\"quantia = 0\\\");\\n\\n        bool isToken0 = _tokenIn == address(token0);\\n        (IERC20 tokenIn, IERC20 tokenOut, uint reserveIn, uint reserveOut) = isToken0\\n            ? (token0, token1, reserve0, reserve1)\\n            : (token1, token0, reserve1, reserve0);\\n\\n        tokenIn.transferFrom(msg.sender, address(this), _amountIn);\\n\\n        /*\\n        Quanto dy para dx?\\n\\n        xy = k\\n        (x + dx)(y - dy) = k\\n        y - dy = k / (x + dx)\\n        y - k / (x + dx) = dy\\n        y - xy / (x + dx) = dy\\n        (yx + ydx - xy) / (x + dx) = dy\\n        ydx / (x + dx) = dy\\n        */\\n        // 0.3% gas fee\\n        uint amountInWithFee = (_amountIn * 997) / 1000;\\n        amountOut = (reserveOut * amountInWithFee) / (reserveIn + amountInWithFee);\\n\\n        tokenOut.transfer(msg.sender, amountOut);\\n\\n        _update(token0.balanceOf(address(this)), token1.balanceOf(address(this)));\\n    }\\n\\n    function addLiquidity(uint _amount0, uint _amount1) external returns (uint shares) {\\n        token0.transferFrom(msg.sender, address(this), _amount0);\\n        token1.transferFrom(msg.sender, address(this), _amount1);\\n\\n        /*\\n        Quanto dx, dy adicionar?\\n\\n        xy = k\\n        (x + dx)(y + dy) = k'\\n\\n        Sem altera\\xE7\\xE3o de pre\\xE7o, antes e depois de adicionar liquidez\\n        x / y = (x + dx) / (y + dy)\\n\\n        x(y + dy) = y(x + dx)\\n        x * dy = y * dx\\n\\n        x / y = dx / dy\\n        dy = y / x * dx\\n        */\\n        if (reserve0 > 0 || reserve1 > 0) {\\n            require(reserve0 * _amount1 == reserve1 * _amount0, \\\"x / y != dx / dy\\\");\\n        }\\n\\n        /*\\n        Quantas a\\xE7\\xF5es para cunhar?\\n\\n        f(x, y) = valor da liquidez\\n        N\\xF3s vamos definir f(x, y) = sqrt(xy)\\n\\n        L0 = f(x, y)\\n        L1 = f(x + dx, y + dy)\\n        T = a\\xE7\\xF5es totais\\n        s = a\\xE7\\xF5es para cunhar\\n\\n        Total de a\\xE7\\xF5es deve aumentar proporcionalmente ao aumento da liquidez\\n        L1 / L0 = (T + s) / T\\n\\n        L1 * T = L0 * (T + s)\\n\\n        (L1 - L0) * T / L0 = s \\n        */\\n\\n        /*\\n        Reivindicar (Claim)\\n        (L1 - L0) / L0 = dx / x = dy / y\\n\\n        Proof\\n        --- Equa\\xE7\\xE3o 1 ---\\n        (L1 - L0) / L0 = (sqrt((x + dx)(y + dy)) - sqrt(xy)) / sqrt(xy)\\n        \\n        dx / dy = x / y ent\\xE3o substitua dy = dx * y / x\\n\\n        --- Equa\\xE7\\xE3o 2 ---\\n        Equa\\xE7\\xE3o 1 = (sqrt(xy + 2ydx + dx^2 * y / x) - sqrt(xy)) / sqrt(xy)\\n\\n        Multiplique por sqrt(x) / sqrt(x)\\n        Equa\\xE7\\xE3o 2 = (sqrt(x^2y + 2xydx + dx^2 * y) - sqrt(x^2y)) / sqrt(x^2y)\\n                   = (sqrt(y)(sqrt(x^2 + 2xdx + dx^2) - sqrt(x^2)) / (sqrt(y)sqrt(x^2))\\n        \\n        sqrt(y) em cima e embaixo se cancela\\n\\n        --- Equa\\xE7\\xE3o 3 ---\\n        Equa\\xE7\\xE3o 2 = (sqrt(x^2 + 2xdx + dx^2) - sqrt(x^2)) / (sqrt(x^2)\\n        = (sqrt((x + dx)^2) - sqrt(x^2)) / sqrt(x^2)  \\n        = ((x + dx) - x) / x\\n        = dx / x\\n\\n        Desde dx / dy = x / y,\\n        dx / x = dy / y\\n\\n        Finalmente\\n        (L1 - L0) / L0 = dx / x = dy / y\\n        */\\n        if (totalSupply == 0) {\\n            shares = _sqrt(_amount0 * _amount1);\\n        } else {\\n            shares = _min(\\n                (_amount0 * totalSupply) / reserve0,\\n                (_amount1 * totalSupply) / reserve1\\n            );\\n        }\\n        require(shares > 0, \\\"shares = 0\\\");\\n        _mint(msg.sender, shares);\\n\\n        _update(token0.balanceOf(address(this)), token1.balanceOf(address(this)));\\n    }\\n\\n    function removeLiquidity(uint _shares)\\n        external\\n        returns (uint amount0, uint amount1)\\n    {\\n        /*\\n        Reivindicar (Claim)\\n        dx, dy = quantidade de liquidez para remover\\n        dx = s / T * x\\n        dy = s / T * y\\n\\n        Prova\\n        Vamos encontrar dx, dy tal que\\n        v / L = s / T\\n        \\n        where\\n        v = f(dx, dy) = sqrt(dxdy)\\n        L = liquidez total = sqrt(xy)\\n        s = a\\xE7\\xF5es\\n        T = oferta total\\n\\n        --- Equa\\xE7\\xE3o 1 ---\\n        v = s / T * L\\n        sqrt(dxdy) = s / T * sqrt(xy)\\n\\n        A quantidade de liquidez a ser removida n\\xE3o deve alterar o pre\\xE7o, portanto\\n        dx / dy = x / y\\n\\n        substituir dy = dx * y / x\\n        sqrt(dxdy) = sqrt(dx * dx * y / x) = dx * sqrt(y / x)\\n\\n        Divida os dois lados da Equa\\xE7\\xE3o 1 com sqrt(y / x)\\n        dx = s / T * sqrt(xy) / sqrt(y / x)\\n           = s / T * sqrt(x^2) = s / T * x\\n\\n        Da mesma maneira\\n        dy = s / T * y\\n        */\\n\\n        // bal0 >= reserve0\\n        // bal1 >= reserve1\\n        uint bal0 = token0.balanceOf(address(this));\\n        uint bal1 = token1.balanceOf(address(this));\\n\\n        amount0 = (_shares * bal0) / totalSupply;\\n        amount1 = (_shares * bal1) / totalSupply;\\n        require(amount0 > 0 && amount1 > 0, \\\"amount0 ou amount1 = 0\\\");\\n\\n        _burn(msg.sender, _shares);\\n        _update(bal0 - amount0, bal1 - amount1);\\n\\n        token0.transfer(msg.sender, amount0);\\n        token1.transfer(msg.sender, amount1);\\n    }\\n\\n    function _sqrt(uint y) private pure returns (uint z) {\\n        if (y > 3) {\\n            z = y;\\n            uint x = y / 2 + 1;\\n            while (x < z) {\\n                z = x;\\n                x = (y / x + x) / 2;\\n            }\\n        } else if (y != 0) {\\n            z = 1;\\n        }\\n    }\\n\\n    function _min(uint x, uint y) private pure returns (uint) {\\n        return x <= y ? x : y;\\n    }\\n}\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint);\\n\\n    function balanceOf(address account) external view returns (uint);\\n\\n    function transfer(address recipient, uint amount) external returns (bool);\\n\\n    function allowance(address owner, address spender) external view returns (uint);\\n\\n    function approve(address spender, uint amount) external returns (bool);\\n\\n    function transferFrom(\\n        address sender,\\n        address recipient,\\n        uint amount\\n    ) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint amount);\\n    event Approval(address indexed owner, address indexed spender, uint amount);\\n}\\n\")), mdx(\"br\", null), mdx(\"h3\", {\n    \"id\": \"testar-no-remix\"\n  }, \"Testar no \", mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"https://remix.ethereum.org/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"Remix\")), mdx(\"br\", null), mdx(\"br\", null));\n}\n;\nMDXContent.isMDXComponent = true;","frontmatter":{"title":"Como criar um produto constante AMM","description":"Nesse artigo iremos aprender a como criar um produto constante AMM através de contrato inteligente.","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEEAgP/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAGyjqxmg//EABsQAAIBBQAAAAAAAAAAAAAAAAISEQEEECEi/9oACAEBAAEFAhrFwbiIyq9bx//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EAB0QAAICAgMBAAAAAAAAAAAAAAERAAIxUQMQEnH/2gAIAQEABj8CIPITazQ1GHY6geZ6CfyZ6//EABsQAQACAwEBAAAAAAAAAAAAAAEAESExQRDx/9oACAEBAAE/IbKQo6ESaRxi4khqmSIxB07Mr5+f/9oADAMBAAIAAwAAABDgz//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8QP//EAB4QAQEAAQMFAAAAAAAAAAAAAAERACFBcVFhgZHR/9oACAEBAAE/EBq+BpzQTZ+d8acSk17GMQYKSj40w9FkihzlHj04WF1d8//Z","aspectRatio":1.5151515151515151,"src":"/static/88c42a86253e0e291f24f1bb34dcc90c/0cb3d/capa.jpg","srcSet":"/static/88c42a86253e0e291f24f1bb34dcc90c/f836f/capa.jpg 200w,\n/static/88c42a86253e0e291f24f1bb34dcc90c/2244e/capa.jpg 400w,\n/static/88c42a86253e0e291f24f1bb34dcc90c/0cb3d/capa.jpg 536w","sizes":"(max-width: 536px) 100vw, 536px"}}},"tags":["Intermediário","DeFi"],"author":["Matheus"],"suburl":"produto-constante-amm/","publishedAt":"21/07/2022","modifiedAt":"20220721"},"tableOfContents":{"items":[{"url":"#produto-constante-amm","title":"Produto Constante AMM","items":[{"url":"#testar-no-remix","title":"Testar no Remix"}]}]},"timeToRead":1},"allMdx":{"nodes":[{"frontmatter":{"suburl":"sistema-de-swap-estavel-amm/","title":"Como criar um sistema de Swap estável AMM","tags":["Avançado","DeFi"]}},{"frontmatter":{"suburl":"produto-constante-amm/","title":"Como criar um produto constante AMM","tags":["Intermediário","DeFi"]}},{"frontmatter":{"suburl":"soma-constante-amm/","title":"Como criar uma soma constante AMM","tags":["Intermediário","DeFi"]}},{"frontmatter":{"suburl":"sistema-de-cofre/","title":"Como criar um sistema de Cofre","tags":["Intermediário","DeFi"]}},{"frontmatter":{"suburl":"sistema-de-staking/","title":"Como criar um sistema de Staking de Recompensas","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"sistema-de-preco-chainlink-oracle/","title":"Como criar um sistema de preços Oracle","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"exemplos-de-uso-do-uniswap-v3/","title":"Exemplos de uso do Uniswap V3","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"fornecimento-unilateral-com-uniswap-v2/","title":"Fornecimento unilateral ideal com Uniswap V2","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"adicionar-e-remover-liquidez-com-uniswap-v2/","title":"Como adicionar e remover liquidez com Uniswap V2","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"swap-com-uniswap-v2/","title":"Como realizar Swap com Uniswap V2","tags":["Intermediário","DeFi"]}},{"frontmatter":{"suburl":"testes-com-echidna/","title":"Como realizar testes com Echidna","tags":["Intermediário"]}},{"frontmatter":{"suburl":"ignorar-verificacao-do-tamanho-do-contrato/","title":"Como ignorar a verificação do tamanho do contrato","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"repeticao-de-assinatura/","title":"Repetição de assinatura","tags":["Avançado","Hacks"]}},{"frontmatter":{"suburl":"manipular-timestamp-do-bloco/","title":"Manipulando o timestamp do bloco na blockchain","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"ataque-front-running/","title":"Ataque utilizando a técnica front running","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"honeypot/","title":"Criar uma armadilha para hackers com a técnica honeypot","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"ocultar-script-malicioso/","title":"Como um contrato malicioso esconde seu script","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"phishing-com-txorigin/","title":"Phishing com tx.origin","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"negacao-de-servico/","title":"Inutilizar um contrato através da negação de serviço","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"fonte-de-aleatoriedade/","title":"Fonte de Aleatoriedade","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"chamada-de-funcao-delegatecall/","title":"Chamada de função delegatecall","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"acessando-variaveis-privadas/","title":"Acessando variáveis privadas","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"auto-destruicao/","title":"Ataques com Auto-destruição","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"estouro-de-memoria/","title":"Ataques com estouro de memória","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"ataque-de-reentrada/","title":"Ataque de reentrada, aprenda como funciona e como evitar","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"bloqueio-de-tempo-timelock/","title":"Criar um contrato com bloqueio de tempo","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"contrato-para-multichamadas/","title":"Criar contrato para Multichamada de funções","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"financiamento-coletivo-crowd-fund/","title":"Criar um sistema de financiamento coletivo","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"sistema-de-leilao-ingles-holandes/","title":"Criar um sistema de leilão inglês e holandês","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"canal-de-pagamento-bidirecional/","title":"Criar um Canal de pagamento bidirecional","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"canal-de-pagamento-unidirecional/","title":"Criar um Canal de pagamento unidirecional","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"gravar-dados-no-slot/","title":"Como gravar dados em qualquer slot","tags":["Intermediário","Aplicações"]}},{"frontmatter":{"suburl":"implantar-contrato-com-proxy/","title":"Como implantar qualquer contrato com Proxy","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"trabalhando-com-proxy/","title":"Trabalhando com Proxy","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"precomputar-endereco-contrato/","title":"Pré-computar endereço do Contrato com Create2","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"token-erc721/","title":"Criando nosso primeiro Token ERC721","tags":["Intermediário","Avançado","Aplicações"]}},{"frontmatter":{"suburl":"token-erc20/","title":"Criando nosso primeiro Token ERC20","tags":["Intermediário","Avançado","Aplicações"]}},{"frontmatter":{"suburl":"aplicacao-mapeamento-iteravel/","title":"Mapeamento Iterável","tags":["Intermediário","Aplicações"]}},{"frontmatter":{"suburl":"aplicacao-arvore-merkle/","title":"Árvore de Merkle","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"aplicacao-multi-assinatura/","title":"Carteira com Multi-Assinaturas","tags":["Intermediário","Avançado","Aplicações"]}},{"frontmatter":{"suburl":"aplicacao-wallet/","title":"Carteira de Tokens","tags":["Iniciante","Aplicações"]}},{"frontmatter":{"suburl":"assinaturas-e-hashing-keccak/","title":"Verificando assinatura hashing com Keccak256","tags":["Intermediário","Avançado"]}},{"frontmatter":{"suburl":"abi/","title":"O que é ABI e para que serve?","tags":["Iniciante"]}},{"frontmatter":{"suburl":"import-e-libraries/","title":"Import e Libraries, para que servem?","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"criar-contrato-simples/","title":"Criar um contrato através de outro contrato","tags":["Intermediário"]}},{"frontmatter":{"suburl":"call-fallback-delegatecall/","title":"Call, Fallback, Delegatecall e chamadas de contratos","tags":["Intermediário"]}},{"frontmatter":{"suburl":"transfer-send-call/","title":"Enviar Ether com transfer, send e call","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"visibilidade-interface-pagavel/","title":"Visibilidade, Interfaces e Funções Pagáveis","tags":["Intermediário"]}},{"frontmatter":{"suburl":"evento-construtor-heranca/","title":"Evento, Construtor e Herança","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"tratamento-de-erros/","title":"Tratamento de erros de condições e exceções","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"funcoes/","title":"Funções e Modificadores","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"armazenamento/","title":"Armazenamento de Dados","tags":["Intermediário"]}},{"frontmatter":{"suburl":"estruturas/","title":"Estruturas - Struct","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"enum/","title":"Enum - Enumeradores","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"mapping-arrays/","title":"Mapping e Arrays","tags":["Iniciante"]}},{"frontmatter":{"suburl":"if-else-for-while/","title":"If, Else, For e While","tags":["Iniciante"]}},{"frontmatter":{"suburl":"ether-wei-gas/","title":"Ether, Wei e Taxa de Gas","tags":["Iniciante"]}},{"frontmatter":{"suburl":"variaveis/","title":"Entendendo as Variáveis","tags":["Iniciante"]}},{"frontmatter":{"suburl":"primeiro-aplicativo/","title":"Meu primeiro aplicativo","tags":["Iniciante","Aplicações"]}}]},"topicsYaml":{"topics":[{"desc":"Todos os conteúdos de nível iniciante estão disponíveis aqui","title":"Iniciante","url":"iniciante/"},{"desc":"Todos os conteúdos de nível intermediário estão disponíveis aqui","title":"Intermediário","url":"intermediario/"},{"desc":"Todos os conteúdos de nível avançado estão disponíveis aqui","title":"Avançado","url":"avancado/"},{"desc":"Todos os artigos referentes a exemplos de aplicações do Solidity, estão disponíveis aqui","title":"Aplicações","url":"aplicacoes/"},{"desc":"Todos os artigos referentes a exemplos de aplicação de hacks do Solidity, estão disponíveis aqui","title":"Hacks","url":"hacks/"},{"desc":"Todos os artigos referentes a exemplos de aplicação DeFi do Solidity, estão disponíveis aqui","title":"DeFi","url":"defi/"},{"desc":"Artigos de outras linguagens de programação, exemplos de interação entre a blockchain e aplicativos externos, estão disponíveis aqui","title":"Outros Artigos","url":"artigos/"}]}},"pageContext":{"suburl":"produto-constante-amm/","postTopics":["Intermediário","DeFi"],"publishedAt":"21/07/2022","prevArticle":{"title":"Como criar uma soma constante AMM","layout":"BlogPage","suburl":"soma-constante-amm/","author":["Matheus"],"tags":["Intermediário","DeFi"],"publishedAt":"20/07/2022","modifiedAt":"20220720"},"nextArticle":{"title":"Como criar um sistema de Swap estável AMM","layout":"BlogPage","suburl":"sistema-de-swap-estavel-amm/","author":["Matheus"],"tags":["Avançado","DeFi"],"publishedAt":"23/07/2022","modifiedAt":"20220723"}}},"staticQueryHashes":["119291576","2330562257","4065828390"]}